#ifndef COMMANDHANDLER_HPP
#define COMMANDHANDLER_HPP
#include "global.hpp"
#include <filesystem>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

//向前声明避免互相包含
class Session;
class CommandHandler
{
public:
    CommandHandler();
    void Parse(const std::string &cmd);                      // 解析命令
    void SetSession(std::shared_ptr<class Session> session); // 设置会话对象
    void SetDataSocket(int data_socket);                     // 设置数据连接套接字
    void SetDataPort(int port);                              // 设置数据端口
    void SetDataIP(const std::string &ip);                   // 设置数据IP

private:
    // 命令处理函数
    void HandleUSER();
    void HandlePASS();
    void HandleCWD();
    void HandleCDUP();
    void HandleMKD();
    void HandleRMD();
    void HandleLIST();
    void HandleNLST();
    void HandleRETR();
    void HandleSTOR();
    void HandleSTOU();
    void HandleDELE();
    void HandlePASV();
    void HandlePORT();
    void HandleTYPE();
    void HandleHELP();
    void HandleNOOP();
    void HandleQUIT();
    void HandleABOR();

    // 辅助函数
    std::string GetCurrentPath();
    std::string GetPassiveAddress();
    void SendData(const std::string &data);
    bool SendFile(const std::string &filename);
    bool ReceiveFile(const std::string &filename);

    // 成员变量
    using CommandFunc = void (CommandHandler::*)();
    std::unordered_map<std::string, CommandFunc> cmd_map_;
    std::shared_ptr<spdlog::logger> logger_;
    std::shared_ptr<class Session> session_;
    int data_socket_ = -1;
    int data_port_ = 0;
    std::string data_ip_;
    std::string current_path_;
    std::string username_;
    bool authenticated_ = false;
    bool binary_mode_ = false;
    bool passive_mode_ = true;
};

#endif // COMMANDHANDLER_HPP
